#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <sys/stat.h>

int subStr(char *arr, char **comm)
{
  int cur = 0;
  comm[cur] = strtok(arr, " ");
  while(comm[cur])
  {
    comm[++cur] = strtok(NULL, " \0");
  }
  return cur;
}

int main()
{
  int fd = open("history.txt", O_APPEND | O_CREAT | O_WRONLY, 0666);
  if(fd == -1)
  {
    perror("open fail\n");
  }
  // dup2(fd, 1);
  int status = 0;
  while(1)
  {
     printf("myshell-># ");
     fflush(stdout);
     // 读取命令
     char arr[128];
     memset(arr, '\0', sizeof(int) * 128);
     fgets(arr, 127, stdin);
     arr[strlen(arr) - 1] = '\0';
     // 切割命令
     char* comm[128];
     int ret = subStr(arr, &comm);
     //for(int i= 0; comm[i] != NULL; i++) 
     //  printf("%s\n", comm[i]);
     if(strcmp(comm[0], "cd") == 0)
     {
       chdir(comm[1]);
       status = errno;
     }
     else 
     {
       if(strcmp(comm[0], "ls") == 0)
       {
         comm[ret++] = "--color=auto";
         comm[ret] = NULL;
       }
       else if(strcmp(comm[0], "echo") == 0 && comm[1][0] == '$')
       {
          if(comm[1][1] == '?')
          {
            printf("%d\n", status);
            status = 0;
            continue;
          }
          else if(comm[1][1] != '\0')
          {
            printf("%s\n", getenv(&comm[1][1]));
            status = 0;
            continue;
          }
       }
       int id = fork();
       if(id == 0)
       {
         execvp(comm[0], comm);
       }
       waitpid(id, &status, 0);
    }
  }
  return 0;
}
